package com.saer.server.hibernate.dao.impl;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

import com.saer.client.constants.ClientConstants;
import com.saer.server.hibernate.dao.HibernateDaoImpl;
import com.saer.server.hibernate.dao.VisitaDao;
import com.saer.server.hibernate.model.Enfermero;
import com.saer.server.hibernate.model.Paciente;
import com.saer.server.hibernate.model.Visita;

@Transactional("saerTransactionManager")
public class VisitaDaoImpl extends HibernateDaoImpl implements VisitaDao {

	public List<?> getVisitas() {
		List<?> result = this.sessionFactory.getCurrentSession()
				.createCriteria(Visita.class)
				.addOrder(Order.desc("fecha"))
				.list();
		
		return result;
	}
	
	public List<?> getVisitasByCap(int capId) {
		List<?> result = this.sessionFactory.getCurrentSession()
				.createCriteria(Visita.class)
				.add(Restrictions.eq("cap.id", capId))
				.addOrder(Order.desc("fecha"))
				.list();

		return result;
	}

	public List<?> getVisitasByHospital(int hospitalId){
		Criteria criteria =	this.sessionFactory.getCurrentSession().createCriteria(Visita.class);
		criteria.add(Restrictions.eq("estado", ClientConstants.VISITA_CONTESTADA));
		criteria.createCriteria("cap").add(Restrictions.eq("hospital.id", hospitalId));
		criteria.addOrder(Order.desc("fecha"));
		List<?> result = criteria.list();

		return result;
	}
	
	public Integer insertarVisita(Visita visita) {
		return (Integer) this.sessionFactory.getCurrentSession().save(visita);
	}
	
	public void insertarPaciente(Paciente paciente) {
		this.sessionFactory.getCurrentSession().save(paciente);
	}
	
	public Enfermero getEnfermero(int id) {
		return (Enfermero) this.sessionFactory.getCurrentSession()
				.createCriteria(Enfermero.class)
				.add(Restrictions.eq("id", id))
				.uniqueResult();
	}
	
	public Paciente getPaciente(String dni) {
		return (Paciente) this.sessionFactory.getCurrentSession()
				.createCriteria(Paciente.class)
				.add(Restrictions.eq("dni", dni))
				.uniqueResult();
	}

	public void updateStatusVisita(int id, int status) {
		Visita visita = (Visita) this.sessionFactory.getCurrentSession()
				.createCriteria(Visita.class)
				.add(Restrictions.eq("id", id))
				.uniqueResult();
		
		if (visita != null ) {
			visita.setEstado(status);
		}
		
		this.sessionFactory.getCurrentSession().saveOrUpdate(visita);
	}
	
	public Visita getVisita(int id) {
		return (Visita) this.sessionFactory.getCurrentSession()
				.createCriteria(Visita.class)
				.add(Restrictions.eq("id", id))
				.uniqueResult();
	}


}
